package org.langqiao.io.file;

import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class TextFileEditorJFrame extends JFrame implements ActionListener {

	private static final long serialVersionUID = -6049579018619237607L;
	private File file;//当前文件
	private JTextArea text;//文本区
	private JFileChooser fchooser;//选择文件对话框
	
	//空文件的构造方法
	public TextFileEditorJFrame(){
		
		super("文本文件编辑器");
		this.setBounds(400,300,400,300);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.text=new JTextArea();
		this.getContentPane().add(new JScrollPane());//添加一个滚动条
	    JMenuBar menubar=new JMenuBar();
	    this.setJMenuBar(menubar);//将菜单栏添加到窗口框架中
	    String menustr[]={"文件","编辑","插入","格式","工具","帮助"};
	    JMenu menu[]=new JMenu[menustr.length];
	    for(int i=0;i<menu.length;i++){
	    	menu[i]=new JMenu(menustr[i]);
	    	menubar.add(menu[i]);//为菜单栏中添加菜单项
	    }
	    String menuitemstr[]={"新建","打开","保存","另存为"};
	    JMenuItem menuitem[]=new JMenuItem[menuitemstr.length];
	    for(int i=0;i<menuitem.length;i++){
	    	menuitem[i]=new JMenuItem(menuitemstr[i]);
	    	menu[0].add(menuitem[i]);//为文件菜单添加子菜单项“新建、打开、保存、另存为”
	    	menuitem[i].addActionListener(this);
	    }
	    menuitem[1].setIcon(new ImageIcon("open.gif"));//设置菜单项的打开文件图标
	    menuitem[2].setIcon(new ImageIcon("save.gif"));//设置菜单项的保存文件秃笔怕
	    
	    JToolBar toolbar=new JToolBar();//工具栏
	    this.getContentPane().add(toolbar,"North");
	    JButton bopen=new JButton("打开",new ImageIcon("open.gif"));
	    bopen.addActionListener(this);
	    toolbar.add(bopen);//在工具栏中添加打开文件
	    JButton bsave=new JButton("保存",new ImageIcon("save.gif"));
	    bsave.addActionListener(this);
	    toolbar.add(bsave);
	    this.setVisible(true);
	    
	    this.file=null;//文件对象空
	    this.fchooser=new JFileChooser(new File(".",""));//文件对话框的初始路径是当前目录
	    this.fchooser.setFileFilter(new FileExtensionFilter("文本文件(*.txt)","txt"));//设置文件过滤器
	}
	
	//指定文件的构造方法
	public TextFileEditorJFrame(File file){
		this();
		if(file!=null){
			this.file=file;
			this.text.setText(this.readFromFile());//指定文件中的字符窜并显示
			this.setTitle(this.file.getName());//将文件名添加在窗口标题栏上
		}
	}
	
	//指定文件名的构造方法
	public TextFileEditorJFrame(String filename){
		this(new File(filename));//若filename=null,抛出空对象异常
	}
	
	//将字符窜lines写入到当前文本文件中
	public void writeToFile(String lines){
		try{
			FileWriter fout=new FileWriter(this.file);//创建字符输出流对象
			fout.write(lines+"\r\n");//想文件字符输出流写入一个字符窜
			fout.close();
		}catch(IOException ioex){
			JOptionPane.showMessageDialog(this,"有IO错，写入"+file.getName()+"文件不成功");
		}
	}
	@SuppressWarnings("finally")
	//使用流从当前文本文件中读取字符窜
	public String readFromFile(){
		char lines[]=null;
		try
		{
			FileReader fin=new FileReader(this.file);//创建字符输入流对象
			lines=new char[(int)this.file.length()];
			fin.read(lines);
			fin.close();
		}catch(FileNotFoundException fe){
			JOptionPane.showMessageDialog(this,"\""+file.getName()+"\"文件不存在");
		}catch(IOException ioex){
			JOptionPane.showMessageDialog(this,"IO错,读取文件"+file.getName()+"不成功");
		}finally{
			return new String(lines);
		}
	}
	
	//单击事件处理方法，单击菜单项
	public void actionPerformed(ActionEvent e){
		if(e.getActionCommand()=="新建"){
			this.file=null;
			this.setTitle("未命名");//设置框架窗口标题
			this.text.setText("");//文本区清空
		}else if(e.getActionCommand()=="打开"&&fchooser.showOpenDialog(this)==JFileChooser.APPROVE_OPTION){//显示打开文件对话框且单击“打开按钮”
			this.file=fchooser.getSelectedFile();//获得文件对话框中选中的当前文件
			this.setTitle(this.file.getName());
			this.text.setText(this.readFromFile());
		}else if(e.getActionCommand()=="保存"&&this.file!=null)
			this.writeToFile(this.text.getText());//保存非空文件，不显示保存文件对话框
		else if(e.getActionCommand()=="保存"&&file==null||e.getActionCommand()=="另存为"&&fchooser.showSaveDialog(this)==JFileChooser.APPROVE_OPTION){
			//保存空文件或者执行“另存为”菜单时，显示文件保存对话框，且单击“保存”按钮
			this.file=fchooser.getSelectedFile();
			if(!file.getName().endsWith(".txt"))
				this.file=new File(file.getAbsolutePath()+".txt");//添加文件扩展名
				this.writeToFile(this.text.getText());
				this.setTitle(this.file.getName());
		}
	}

	public static void main(String[] args){
		new TextFileEditorJFrame("唐诗凉州词.txt");
	}
}
